#include <bits/stdc++.h>
#define MAXN 12
int ma[MAXN][MAXN];//存储图
int que[MAXN];
int indegree[MAXN];//记录入度个数
int n, m;
void topo()
{
    int rear = 0, front = 0;
    for(int i=1;i<=n;i++)//寻找入度为零的节点入列
    {
        if(indegree[i]==0)
            que[rear++] = i;
    }
    while(front<rear)
    {
        for(int i=1;i<=n;i++)//遍历每个节点
        {
            if(ma[que[front]][i]==1)
            {
                indegree[i]--;//入度数目减少
                if(indegree[i]==0)//如果入度为零，则入列
                    que[rear++] = i;
            }
        }
        front++;//将节点出列
    }
    if(front==n)//所有节点都已遍历完全，都可以完成
        printf("YES\n");
    else
        printf("NO\n");
}
int main()
{
    int a, b;
    while(~scanf("%d %d", &n, &m))
    {
        memset(ma, 0, sizeof(ma));
        memset(indegree, 0, sizeof(indegree));
        for(int i=0;i<m;i++)
        {
            scanf("%d %d", &a, &b);
            ma[a][b] = 1;//有路
            indegree[b]++;//入度个数增加
        }
        topo();
    }
    return 0;
}
